﻿//VariablesGlobales
var ListaCategoriasClientes;
var ListaCategoriasProductos;
var ListaLineasProductos;
var ListaMarcasProductos;
var ListaProveedores;
var ListaProductos;
var ListaMateriasPrimas;
var ListaClientes;
var ListaCondicionesPago;
var ListaDominios;
var ListaCuentasBancarias;
var GridTotalHeight = 450;

//Variables de Modulo Clientes
var ClienteNuevo = "0";
var NombreClienteEditado = "";

//Variables de Modulo Clientes
var ProveedorNuevo = "0";
var NombreProveedorEditado = "";

//Variables del Moculo Cotizaciones
var NombreClienteCotizado = "";
var TotalCotizado = "";

//Variables del Modulo Inventarios
var ProductoNuevo = "0";
var NombreProductoEditado = "";

//VariablesGobales
var panelActual = "Clientes";

//Variables del Moculo Compras
var NombreProveedorCotizado = "";
var TotalCotizadoCompra = "";

//Variables del Modulo Bancos
var NombreCuentaBancaria = "";
var CuentaNuevo = "";
var NombreCuentaEditada = "";

$().ready(function () {
    $(document).Ribbon();
    ResizeContenedores();
    $(window).resize(function () {
        ResizeContenedores();
    });
    ResizeContenedores();
    $('[accesskey=2]').click();

    //Cargando los datos default de los autocompletadores
    LoadCategoriasClientes();
    LoadCategoriasProductos();
    LoadLineasProductos();
    LoadMarcasProductos();
    LoadListaClientes();
    LoadListaProductos();
    // LoadListaMateriasPrimas(0);
    LoadListaProveedores();
    LoadCondicionesPago();
    LoadDominios();
    LoadCuentasBancarias();
    $.datepicker.setDefaults({
        dayNamesMin: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'vi', 'Sa'],
        monthNames: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Augosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],
        monthNamesShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
        nextText: "Siguiente",
        prevText: "Anterior",
        closeText: "Cerrar",
        currentText: "Hoy",
        showAnim: "slide",
        dateFormat: "dd/mm/yy"
    });
    //Estableciendo los selectores de fechas de los reportes
    var FIni = new Date();
    var FFin = new Date();
    FIni.prevMonth();
    FIni.prevMonth();
    var FechaInicial = FIni.getDate() + "/" + (new Number(FIni.getMonth()) + 1) + "/" + FIni.getFullYear();
    var FechaFinal = FFin.getDate() + "/" + (new Number(FFin.getMonth())+1) + "/" + FFin.getFullYear();
    $(".fechaInicial").each(function () { $(this).val(FechaInicial); });
    $(".fechaFinal").each(function () { $(this).val(FechaFinal); });
    $(".fechaReportes").attr("readonly", "readonly").datepicker({
        numberOfMonths: 2,
        showButtonPanel: true
    });
    //Finalizado selectores de fechas

    AutocompletarDominios();
});

//Llenado de un combo con datos de un JSON
$.fn.addItemsCuentas = function (data) {
    return this.each(function () {
        var list = this;
        $.each(data, function (index, itemData) {
            var option = new Option(itemData.alias, itemData.id);
            list.add(option);
        });
    });
};

//Llenado de un combo con datos de un JSON
$.fn.LoadItemPrices = function (data) {
    return this.each(function () {
        var list = this;
        $(this).empty();
        var option1 = new Option(formatCurrency(data.Precio1), data.Precio1);
        list.add(option1);
        var option2 = new Option(formatCurrency(data.Precio2), data.Precio2);
        list.add(option2);
        var option3 = new Option(formatCurrency(data.Precio3), data.Precio3);
        list.add(option3);
        var option4 = new Option(formatCurrency(data.Precio4), data.Precio4);
        list.add(option4);

    });
};

//Llenado de un combo con datos de un JSON
$.fn.addItemsFacturasCotizacion = function (data) {
    return this.each(function () {
        var list = this;
        $.each(data, function (index, itemData) {
            if(parseFloat(itemData.SaldoPendiente)>0)
            {
                var option = new Option(itemData.Serie+ itemData.NoFolio + " (" +formatCurrency( itemData.SaldoPendiente) + ")", itemData.id);
                list.add(option);
            }
        });
    });
};



//Verificacion si el texto del parametro es numerico
function IsNumeric(sText) {
    var ValidChars = "0123456789.,";
    var IsNumber = true;
    var Char;


    for (i = 0; i < sText.length && IsNumber == true; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1) {
            IsNumber = false;
        }
    }
    return IsNumber;

}

//Verifica si la entrada de teclado es numerica
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    //alert(charCode);


    if (charCode > 31 && (charCode < 44 || charCode > 57))
        return false;

    return true;
}

//Verifica si la entrada de teclado es numerica
function isNumberKeyPor(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    //alert(charCode);
    if (charCode == 37)
        return true;
    if (charCode > 31 && ((charCode < 44 || charCode > 57)))
        return false;

    return true;
}

//Formate lo ingresado a tipo moneda
function formatCurrency(num) {
    num = num.toString().replace(/\$|\,/g, '');
    if (isNaN(num))
        num = "0";
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num * 100 + 0.50000000001);
    cents = num % 100;
    num = Math.floor(num / 100).toString();
    if (cents < 10)
        cents = "0" + cents;
    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
        num = num.substring(0, num.length - (4 * i + 3)) + ',' +
num.substring(num.length - (4 * i + 3));
    return (((sign) ? '' : '-') + '$' + num + '.' + cents);
}

function reformatCurrency() {
}


//AutoCompletador de Estados 
function AutocompletarEstados(idContenedor) {
    $("#" + idContenedor).autocomplete(ListadoEstados, {
        minChars: 0,
        width: 180,
        matchContains: "word",
        scrollHeight: 300,
        cacheLength: 32,
        autoFill: false,
        formatItem: function (row, i, max) {
            return row.NombreEstado;
        },
        formatMatch: function (row, i, max) {
            return row.NombreEstado;
        },
        formatResult: function (row) {
            return row.NombreEstado;
        }
    }).result(function (event, item) {

    });

}


//Autocompletador de Municipios
function AutocompletarMunicipios(idContenedor) {
    $("#" + idContenedor).autocomplete(ListadoMunicipios, {
        minChars: 0,
        width: 550,
        matchContains: "word",

        autoFill: false,
        formatItem: function (row, i, max) {
            return i + "/" + max + ": \"" + row.NombreMunicipio;
        },
        formatMatch: function (row, i, max) {
            return row.NombreMunicipio;
        },
        formatResult: function (row) {
            return row.NombreMunicipio;
        }
    }).result(function (event, item) {

    });

}

//AutocompletadorDominios
function AutocompletarDominios() {

    $(".dominioEmail").live('focus', function () {
        LoadDominios();
        $(".dominioEmail").autocomplete(ListaDominios, {
            minChars: 0,
            width: 200,
            matchContains: "word",
            panelPosition: "top",
            autoFill: false,
            formatItem: function (row, i, max) {
                return row.Dominio;
            },
            formatMatch: function (row, i, max) {
                return row.Dominio;
            },
            formatResult: function (row) {

                return row.Dominio;
            }
        }).result(function (event, item) {

        }).setOptions({ data: ListaDominios });
    });

}


//Serializacion de Formularios a JSON
$.fn.extractJSON = function () {
    var accum = {};
    function add(accum, namev, value) {
        if (namev.length == 1)
            accum[namev[0]] = value;
        else {
            if (accum[namev[0]] == null)
                accum[namev[0]] = {};
            add(accum[namev[0]], namev.slice(1), value);
        }
    };
    this.find('input, textarea, select').each(function () {
        if ($(this).attr('name') != "__VIEWSTATE" && $(this).attr('name') != "__EVENTVALIDATION")
            add(accum, $(this).attr('name').split('.'), $(this).val());
    });
    return accum;
};


//Redimenciona los espacios de la aplicacion
function ResizeContenedores() {
    var anchoMaximo = 1100;
    if ($(window).width() > anchoMaximo) {
        //$('#ContenedorPaneles').css("width", (anchoMaximo - 3) + "px");
        $('#Contenido').css("width", (anchoMaximo - 50) + "px");
    }
    else {
        //$('#ContenedorPaneles').css("width", ($(window).width() - 3) + "px");
        $('#Contenido').css("width", ($(window).width() - 50) + "px");
    }
    $('#Contenido').css("height", ($(window).height() - 125) + "px");
    $('#ContenedorPaneles').css("height", ($(window).height() - 125) + "px");
    GridTotalHeight = $(window).height() - 270;
}


var botonPresionadoInactivo = "";

//Realiza la accion de activar un boton desde el ribbonmenu
function RibbonMenuBoton(boton) {
    var BotonTarget = $(boton).attr('rel');
    if ($("#" + BotonTarget).attr("disabled") != true) {
        if (botonPresionadoInactivo != boton) {
            botonPresionadoInactivo = boton;
            if ($("#" + BotonTarget).attr("onclick") == null) {
                if ($('#' + BotonTarget).closest('form').valid())
                    $('#' + BotonTarget).closest('form').trigger("click.form-plugin", [BotonTarget]);
            }
            else
                $("#" + BotonTarget).click();
            setTimeout(function () { botonPresionadoInactivo = "";}, 3000);
        }
        else {
            alert("El sistema aun esta procesando su solicitud, espere un momento por favor.");
        }
    }
}

//Verificacion de los votones activos dentro del ribbon
function checkBotonesActivos(panelBotones) {
    var listaBotones = $("input[rel='" + panelBotones + "']");
    $.each(listaBotones, function (index, item) {
        if (item.disabled == true) {
            $("div[rel='" + item.id + "']").css("filter", "alpha(opacity=20)").css("opacity", "0.2").css("-moz-opacity", "0.2").css("filter", "alpha(opacity=20)");
            $("li[rel='" + item.id + "']").css("opacity", "0.2");
            $("li[rel='" + item.id + "']").css("-moz-opacity", "0.2");
        }
        else {
            $("div[rel='" + item.id + "']").css("filter", "alpha(opacity=100)");
            $("div[rel='" + item.id + "']").css("opacity", "1.0");
            $("div[rel='" + item.id + "']").css("-moz-opacity", "a1.0");
            $("li[rel='" + item.id + "']").css("filter", "alpha(opacity=100)");
            $("li[rel='" + item.id + "']").css("opacity", "1.0");
            $("li[rel='" + item.id + "']").css("-moz-opacity", "a1.0");
        }
    });
}

//Muestra un panel en particular dentro de la aplicacion y carga la pagina default 
//en caso de que no haya informacion dentro de el panel
function mostrarPanel(nombrePanel) {
    $('#Div' + panelActual).hide();
    //Ocultando el Objeto de Ajax Upload
    $(".AjaxFileUploader").hide();
    if (nombrePanel == "Inventarios")
        $(".AjaxFileUploader").show();
    //Barrido de los paneles
    var x = 0;
    for (x = 0; x < panelMatrix.length; x++) {
        if (panelMatrix[x][0] == nombrePanel) {
            panelIndex = x;
            if (panelMatrix[panelIndex][1] == false) {
                panelMatrix[panelIndex][1] = true;
                if ($('#Div' + nombrePanel).html() == "") {
                    CrearLoaderDiv('#Div' + nombrePanel, nombrePanel + "Loader");
                    $('#Div' + nombrePanel).load(panelMatrix[panelIndex][2]);
                }
            }
        }
    }

    $('#Div' + nombrePanel).show();
    panelActual = nombrePanel;
}

//Esconde todos los paneles de informacion de la aplicacion
function hidePanels() {

    var x = 0;
    for (x = 0; x < listaPaneles.length; x++) {
        $('#Div' + listaPaneles[x]).hide();
    }
    $("#AjaxUploaderInputDiv").css("display", "none");
    alert();
}


//Manejo de las alertas de el sistema
function MostrarAlerta(htmlAlerta) {
    $("#ContenidoAlertaSistema").html(htmlAlerta);
    //$("#AlertaFlotante").show("drop");
    setTimeout(function () {
        $("#DivAlertaSistema").dialog({
            resizable: false,
//            height: 240,
           width: 450,
            modal: true,
            buttons: {
                "Aceptar": function () {

                    $(this).dialog("close");
                }
            }
        });
    }, 100);
}

function MostrarConfirmacion(htmlConfirmacion, captionBoton, accionConfirmada) {
    $("#ContenidoAlertaSistema").html(htmlConfirmacion);
    setTimeout(function () {
        $("#DivAlertaSistema").dialog({
            resizable: false,
            width: 750,
            modal: true,
            buttons: {
                "Confirmar Eliminar Registro": function () {
                    accionConfirmada();
                    $(this).dialog("close");
                },
                "Cancelar": function () {

                    $(this).dialog("close");
                }
            }
        });
    }, 100);
}

function MostrarError(htmlError) {
    $("#ContenidoAlertaSistema").html(htmlError);
    //$("#AlertaErrorFlotante").show("drop");
    setTimeout(function () {
        $("#DivAlertaSistema").dialog({
            resizable: false,
            //            height: 240,
                      width: 450,
            modal: true,
            buttons: {
                "Aceptar": function () {

                    $(this).dialog("close");
                }
            }
        });
    }, 100);
}

function AlertaDatosObligatorios(form, validator) {
    setTimeout(function () {
        $("#DialogoErrorFormulario").dialog({
            resizable: false,
            height: 240,
            width: 350,
            modal: true,
            buttons: {
                "Aceptar": function () {

                    $(this).dialog("close");
                }
            }
        });
    }, 100);
}


/*
* Date Format 1.2.3
* (c) 2007-2009 Steven Levithan <stevenlevithan.com>
* MIT license
*
* Includes enhancements by Scott Trenda <scott.trenda.net>
* and Kris Kowal <cixar.com/~kris.kowal/>
*
* Accepts a date, a mask, or a date and a mask.
* Returns a formatted version of the given date.
* The date defaults to the current date/time.
* The mask defaults to dateFormat.masks.default.
*/

var dateFormat = function () {
    var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
		timezoneClip = /[^-+\dA-Z]/g,
		pad = function (val, len) {
		    val = String(val);
		    len = len || 2;
		    while (val.length < len) val = "0" + val;
		    return val;
		};

    // Regexes and supporting functions are cached through closure
    return function (date, mask, utc) {
        var dF = dateFormat;

        // You can't provide utc if you skip other args (use the "UTC:" mask prefix)
        if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
            mask = date;
            date = undefined;
        }

        // Passing date through Date applies Date.parse, if necessary
        date = date ? new Date(date) : new Date;
        if (isNaN(date)) throw SyntaxError("invalid date");

        mask = String(dF.masks[mask] || mask || dF.masks["default"]);

        // Allow setting the utc argument via the mask
        if (mask.slice(0, 4) == "UTC:") {
            mask = mask.slice(4);
            utc = true;
        }

        var _ = utc ? "getUTC" : "get",
			d = date[_ + "Date"](),
			D = date[_ + "Day"](),
			m = date[_ + "Month"](),
			y = date[_ + "FullYear"](),
			H = date[_ + "Hours"](),
			M = date[_ + "Minutes"](),
			s = date[_ + "Seconds"](),
			L = date[_ + "Milliseconds"](),
			o = utc ? 0 : date.getTimezoneOffset(),
			flags = {
			    d: d,
			    dd: pad(d),
			    ddd: dF.i18n.dayNames[D],
			    dddd: dF.i18n.dayNames[D + 7],
			    m: m + 1,
			    mm: pad(m + 1),
			    mmm: dF.i18n.monthNames[m],
			    mmmm: dF.i18n.monthNames[m + 12],
			    yy: String(y).slice(2),
			    yyyy: y,
			    h: H % 12 || 12,
			    hh: pad(H % 12 || 12),
			    H: H,
			    HH: pad(H),
			    M: M,
			    MM: pad(M),
			    s: s,
			    ss: pad(s),
			    l: pad(L, 3),
			    L: pad(L > 99 ? Math.round(L / 10) : L),
			    t: H < 12 ? "a" : "p",
			    tt: H < 12 ? "am" : "pm",
			    T: H < 12 ? "A" : "P",
			    TT: H < 12 ? "AM" : "PM",
			    Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
			    o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
			    S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
			};

        return mask.replace(token, function ($0) {
            return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
        });
    };
} ();

// Some common format strings
dateFormat.masks = {
    "default": "ddd mmm dd yyyy HH:MM:ss",
    shortDate: "m/d/yy",
    mediumDate: "mmm d, yyyy",
    longDate: "mmmm d, yyyy",
    fullDate: "dddd, mmmm d, yyyy",
    shortTime: "h:MM TT",
    mediumTime: "h:MM:ss TT",
    longTime: "h:MM:ss TT Z",
    isoDate: "yyyy-mm-dd",
    isoTime: "HH:MM:ss",
    isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
    isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};

// Internationalization strings
dateFormat.i18n = {
    dayNames: [
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
	],
    monthNames: [
		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
		"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
	]
};

// For convenience...
Date.prototype.format = function (mask, utc) {
    return dateFormat(this, mask, utc);
};



function prevMonth() {
    var thisMonth = this.getMonth();
    this.setMonth(thisMonth - 1);
    if (this.getMonth() != thisMonth - 1 && (this.getMonth() != 11 || (thisMonth == 11 && this.getDate() == 1)))
        this.setDate(0);
}
function nextMonth() {
    var thisMonth = this.getMonth();
    this.setMonth(thisMonth + 1);
    if (this.getMonth() != thisMonth + 1 && this.getMonth() != 0)
        this.setDate(0);
}

Date.prototype.nextMonth = nextMonth;
Date.prototype.prevMonth = prevMonth;


function URLEncode(clearString) {
    var output = '';
    var x = 0;
    clearString = clearString.toString();
    var regex = /(^[a-zA-Z0-9_.]*)/;
    while (x < clearString.length) {
        var match = regex.exec(clearString.substr(x));
        if (match != null && match.length > 1 && match[1] != '') {
            output += match[1];
            x += match[1].length;
        } else {
            if (clearString[x] == ' ')
                output += '+';
            else {
                var charCode = clearString.charCodeAt(x);
                var hexVal = charCode.toString(16);
                output += '%' + (hexVal.length < 2 ? '0' : '') + hexVal.toUpperCase();
            }
            x++;
        }
    }
    return output;
}



function PostPrintReporte(tipo, datos, fechaInicial, fechaFinal) {//,to, p) {
    var myForm = document.createElement("form");
    myForm.action = "/impresionReporte.aspx";
    myForm.method = "post";
    //myform.target = "iframeLoader";

    var fechaI = document.createElement("input");
    fechaI.setAttribute("name", "fechaInicial");
    fechaI.setAttribute("type", "hidden");
    fechaI.setAttribute("value", fechaInicial);
    myForm.appendChild(fechaI);

    var fechaF = document.createElement("input");
    fechaF.setAttribute("name", "fechaFinal");
    fechaF.setAttribute("type", "hidden");
    fechaF.setAttribute("value", fechaFinal);
    myForm.appendChild(fechaF);

    var Tipo = document.createElement("input");
    Tipo.setAttribute("name", "tipo");
    Tipo.setAttribute("type", "hidden");
    Tipo.setAttribute("value", tipo);
    myForm.appendChild(Tipo);

    var Datos = document.createElement("input");
    Datos.setAttribute("name", "tablaReporte");
    Datos.setAttribute("type", "hidden");
    Datos.setAttribute("value", datos);
    myForm.appendChild(Datos);


    document.body.appendChild(myForm);
    myForm.submit();

    document.body.removeChild(myForm);
}


function EmailDocument(idDocumento,emails,mensaje,actionURL) {//,to, p) {
    var myForm = document.createElement("form");
    myForm.action = actionURL; // "/impresionReporte.aspx";
    myForm.target = "_blank";
    myForm.method = "post";
    //myform.target = "iframeLoader";

    var inputDocumento = document.createElement("input");
    inputDocumento.setAttribute("name", "idCotizacion");
    inputDocumento.setAttribute("type", "hidden");
    inputDocumento.setAttribute("value", idDocumento);
    myForm.appendChild(inputDocumento);

    var inputEsEmail = document.createElement("input");
    inputEsEmail.setAttribute("name", "email");
    inputEsEmail.setAttribute("type", "hidden");
    inputEsEmail.setAttribute("value", "true");
    myForm.appendChild(inputEsEmail);

    var inputDestinos = document.createElement("input");
    inputDestinos.setAttribute("name", "destinatarios");
    inputDestinos.setAttribute("type", "hidden");
    inputDestinos.setAttribute("value", emails);
    myForm.appendChild(inputDestinos);

    var Mensaje = document.createElement("input");
    Mensaje.setAttribute("name", "mensajePersonal");
    Mensaje.setAttribute("type", "hidden");
    Mensaje.setAttribute("value", mensaje);
    myForm.appendChild(Mensaje);


    document.body.appendChild(myForm);
    myForm.submit();

    document.body.removeChild(myForm);
}



/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

var Base64 = {

    // private property
    _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode: function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode: function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }

        }

        output = Base64._utf8_decode(output);

        return output;

    },

    // private method for UTF-8 encoding
    _utf8_encode: function (string) {
        string = string.replace(/\r\n/g, "\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if ((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode: function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while (i < utftext.length) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if ((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i + 1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i + 1);
                c3 = utftext.charCodeAt(i + 2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}



function buscadorJQGrid(idGrid, idPaginador, tituloBoton, alturaRenglon) {
$('#'+idGrid).navGrid('#'+idPaginador, { edit: false, add: false, del: false, search: false })
            .jqGrid('filterToolbar', { stringResult: true, searchOnEnter: false })
            .jqGrid('navButtonAdd', "#"+idPaginador, { caption: tituloBoton, buttonicon :'ui-icon-search', title: "Mostrar/Ocultar Buscador",
                onClickButton: function () {
                    if ($("#gview_"+idGrid+" .ui-search-toolbar").css("display") == "none") {
                        $("#gview_" + idGrid + " .ui-search-toolbar").css("display", "");
                        $("#gview_" + idGrid + " .ui-jqgrid-bdiv").css("height", $("#gview_" + idGrid + " .ui-jqgrid-bdiv").height() - alturaRenglon);
                    } else {
                        $("#gview_" + idGrid + " .ui-search-toolbar").css("display", "none");
                        $("#gview_" + idGrid + " .ui-jqgrid-bdiv").css("height", $("#gview_" + idGrid + " .ui-jqgrid-bdiv").height() + alturaRenglon);
                    }
                }
            });
            $("#gview_" + idGrid + " .ui-search-toolbar").css("display", "none");
}